package com.glc.hms.common.util;

import java.math.BigDecimal;
import java.math.MathContext;
import java.text.DecimalFormat;

/**
 * 参数运算工具类型
 *
 * @author ljt
 * @since 2019-11-27 23:46
 */
public class BigDecimalUtil {
    private BigDecimalUtil() {
    }

    /**
     * 输入多个数字进行相乘
     * @param values
     * @return
     */
    public static Double multiply(Number... values) {
        BigDecimal result = new BigDecimal(1);
        for (Number v : values) {
            if (v == null) {
                continue;
            }
            result = result.multiply(new BigDecimal(String.valueOf(v)), MathContext.DECIMAL64);
        }
        return result.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 输入多个数字进行相加
     * @param values
     * @return
     */
    public static Double add(Number... values) {
        BigDecimal result = BigDecimal.ZERO;
        for (Number v : values) {
            if (v == null) {
                continue;
            }
            result = result.add(new BigDecimal(String.valueOf(v)), MathContext.DECIMAL64);
        }
        return result.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 前面减后面
     *
     * @param start
     * @param end
     * @return
     */
    public static Double subtract(Number start, Number end) {
        BigDecimal result = new BigDecimal(String.valueOf(start == null ? 0 : start)).subtract(new BigDecimal(String.valueOf(end == null ? 0 : end)));
        return result.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 前面除后面
     *
     * @param start
     * @param end
     * @return
     */
    public static Double divide(Number start, Number end) {
        if (null == start|| null == end||end.equals(0)||start.equals(0)) {
            return 0.00;
        }
        BigDecimal result = new BigDecimal(String.valueOf(start == null ? 0 : start)).divide(new BigDecimal(String.valueOf(end)), MathContext.DECIMAL64);
        return result.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 四舍五入，保留两位小数
     * @param number
     * @return
     */
    public static Double format(Number number) {
        return format(number, 2);
    }

    /**
     * 四舍五入，保留num位小数
     *
     * @param number
     * @return
     */
    public static Double format(Number number, int num) {

        StringBuilder stringBuffer = new StringBuilder("##0");
        for (int i = 0; i < num; i++) {
            stringBuffer.append(i == 0 ? ".0" : "0");
        }
        DecimalFormat decimalFormat = new DecimalFormat(stringBuffer.toString());
        return Double.valueOf(decimalFormat.format(number));
    }


    /**
     * 前面除后面,乘以100获得百分比
     *(1.2 除  10 = 120% )
     * @param start  除数
     * @param end  被除数
     * @return
     */
    public static Double divideHundred(Number start, Number end) {
        BigDecimal result = new BigDecimal(String.valueOf(start == null ? 0 : start)).divide(new BigDecimal(String.valueOf(end)), MathContext.DECIMAL64);
        return result.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue() * 100;
    }
}
